package it.maganar.lesscaos.session;

import it.maganar.lesscaos.entity.Disponibilita;
import it.maganar.lesscaos.entity.Partecipazione;
import it.maganar.lesscaos.entity.Tappa;
import it.maganar.lesscaos.entity.User;

import java.sql.Time;
import java.util.List;

import javax.ejb.Stateless;

@SuppressWarnings("unchecked")
@Stateless
public class DisponibilitaGiornalieraManagerBean extends DisponibilitaManagerBean implements DisponibilitaGiornalieraManagerLocal{
	
	/**
     * Default constructor. 
     */
    public DisponibilitaGiornalieraManagerBean() {
    	
    }

	@Override
	public boolean inserisciDisponibilitaGiornaliera(User u, Disponibilita d) {
		if (u == null || d == null) {
			return false;
		}
		if (controllaSovrapposizioni(u.getNomeUtente(), d)) {
			return false;
		}
		
		//salvo le tappe nel DB
		manager.persist(d.getPartenza());
		manager.flush();
		if(d.getListaTappe() != null){
			for (Tappa t: (List<Tappa>)d.getListaTappe()) {
				manager.persist(t);
				manager.flush();
			}
		}
		manager.persist(d.getArrivo());
		manager.flush();
		
		//salvo la disponibilita
		manager.persist(d);
		manager.flush();
		
		u = manager.find(User.class, u.getNomeUtente());
		//aggiungo la lista delle disponibilità associata all'utente
		u.getListaDisponibilita().add(d);
		manager.merge(u);
		manager.flush();
		return true;
	}
	
	/**
	 * 
	 * @param d la disponibilità da controllare, sapendo che è una disponibilità giornaliera
	 * @return <code>true</code> se c'è una sovrapposizione, <code>false</code> se non ci sono sovrapposizioni
	 */
	private boolean controllaSovrapposizioni(String nomeUtente, Disponibilita dToCheck){
		
		User u = manager.find(User.class, nomeUtente);
		List listaPartecipazioni = u.getListaPartecipazioni();
		List listaDisponibilita = u.getListaDisponibilita();
		Time orario_partenza = dToCheck.getOrarioPart();
		Time orario_arrivo = dToCheck.getOrarioArr();
		
		//tratto le pertecipazioni e le disponibilità controllando se una di queste si sovrappone
		//in orario alla mia. Siccome la mia è giornaliera, non mi interessa verificare il tipo dell'altra
		if (listaPartecipazioni != null) {
			for (Partecipazione p : (List<Partecipazione>) listaPartecipazioni)
			{
				Time orario_partenza_p = p.getPartenza().getOrario();
				Time orario_arrivo_p = p.getArrivo().getOrario();
				
				if ((orario_partenza_p.after(orario_partenza) && orario_partenza_p.before(orario_arrivo)) ||
					(orario_partenza.after(orario_partenza_p) && orario_partenza.before(orario_arrivo_p)) ||
					(orario_partenza.equals(orario_partenza_p)))
				{
					return true;
				}
			}
		}
		
		if (listaDisponibilita != null) {
			for (Disponibilita d : (List<Disponibilita>) listaDisponibilita)
			{
				Time orario_partenza_d = d.getOrarioPart();
				Time orario_arrivo_d = d.getOrarioArr();
				
				if ((orario_partenza_d.after(orario_partenza) && orario_partenza_d.before(orario_arrivo)) ||
					(orario_partenza.after(orario_partenza_d) && orario_partenza.before(orario_arrivo_d)) ||
					(orario_partenza.equals(orario_partenza_d)))
				{
					return true;
				}
			}		
		}
		return false;
	}

}
